﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
// Copyright (C) 2021 kingerrobot
// 版权所有。 
//
// 文件名：ExWarehousingAfterImpl
// 文件功能描述：出库线体扫描
//
// 创建者：名字 (zzl)
// 时间：2021/12/30 9:30:32
//
// 修改人：
// 时间：
// 修改说明：
// 版本：V1.0.0
//----------------------------------------------------------------*/
#endregion
namespace KingerRobot.MexicoSailunMDC.SpiService;
[Logging]
public class ExWarehousingAfterScanImpl : IExWarehousingAfterScanService
{
    private readonly static ITaskCmd _TaskCmd = new BTaskCmd();
    private readonly static ITask _Task = new BTask();
    private readonly static IWcsLocSku _WcsLocSku = new BWcsLocSku();
    private readonly static IRcsLocation _RcsLocation = new BRcsLocation();
    private readonly static IWmsOutOrderSummary _WmsOutOrderSummary = new BWmsOutOrderSummary();
    private readonly static IWcsNetAbnormal _WcsNetAbnormal = new BWcsNetAbnormal();
    private readonly static IAbnormal _Abnormal = new BAbnormal();
    private readonly static IProdSku _ProdSku = new BProdSku();
    public long CreateTask(long locId, string productCode, int lineTaskNo, string sProductCode, string targetLoc = "")
    {
        if (productCode == sProductCode)
        {
            return -1;
        }

        // 线体任务
        var ltask = _Task.GetTaskByTaskNo(lineTaskNo);

        // 判断是否异常任务
        //if (ltask is not null)
        //{
        //    //if (lineTaskNo != 0)
        //    //{
        //    var targetLocId = _WcsNetAbnormal.GetAbnormalLocIdByStartLoc(locId);
        //    var plcCode = _RcsLocation.GetLocationById(targetLocId)?.PlcCode;
        //    if (plcCode.Equals(targetLoc))
        //    {
        //        return 1;
        //    }
        //    // }
        //}


        // 非异常任务
        var ltaskId = ltask?.Id ?? 0;
        var lstatus = ltask?.TaskStatus ?? 0;
        var summaryId = ltask?.SummaryId ?? 0;
        var ltype = ltask?.TaskType ?? 0;
        var lskuId = ltask?.SkuId ?? 0;
        var remark = ltask?.RemarkMemo;
        var isOutScanner = ltask?.IsOutScanner;

        if (lstatus == (int)EnumTaskStatus.Executable || ltype == (int)EnumTaskType.Abnormal)
        {
            return ltaskId;
        }

        //// 异常任务创建
        //var abnormalTaskId = _Abnormal.LocationAbnormalTaskAndCmdRetTaskId(locId,
        //     lskuId,
        //     $"位置:{locId}扫到线体条码{productCode}与扫描条码{sProductCode}不一致。线体任务{lineTaskNo},创建异常任务", productCode, lineTaskNo);

        // 异常任务创建
        var realSku = _ProdSku.GetProdSkuBySkuCode(productCode)?.Id ?? 0;
        var realTask = _Task.GetTaskByProductCodev2(productCode);
        long abnormalTaskId = 0;
        //如果正确条码有任务 则用正确条码的任务 否则生成异常任务
        if (realTask is not null)
        {
            abnormalTaskId= realTask.Id ?? 0;
        }
        else
        {
             abnormalTaskId = _Abnormal.LocationOutAbnormalTaskAndCmdRetTaskId(locId,
                 realSku,
                 $"位置:{locId}二次扫到线体条码{productCode}与扫描条码{sProductCode}不一致。原线体任务{lineTaskNo},创建异常任务", productCode, lineTaskNo);
        }
        if (abnormalTaskId > 0)
        {
            //如果线体任务已经被出库扫描扫过 证明扫过任务是正常的 此处不正常的任务是用了上一条的任务号 所以不可删除上一条的任务号
            //此处只有没扫过的任务号才会删除对应任务
            if (isOutScanner == 0)
            {

                // 条码获取库位修改为异常库位
                _RcsLocation.UpdateCrnLocEnableRemark(productCode, $"{remark} | 线体条码{productCode},实际条码{sProductCode}, 修改线体条码库存禁用.");
                _RcsLocation.UpdateCrnLocEnableRemark(sProductCode, $"{remark} | 线体条码{productCode},实际条码{sProductCode}, 修改实际条码库存禁用.");

                if (ltaskId == 0)
                {
                    return abnormalTaskId;
                }
                // 修改任务
                _Task.UpdateTaskAbnormal(ltaskId, abnormalTaskId, $"位置:{locId}扫到线体条码{productCode}与扫描条码{sProductCode}不一致。线体任务{lineTaskNo},删除原任务");

                // 重新请料
                SetOrderSummaryPlanCount(summaryId);
                // 删除线体任务
                _Task.BakAndDeleteTaskAndCmd(ltaskId);
            }

            // 创建异常任务到异常口
            return abnormalTaskId;
        }
        return 0;
    }

    private void SetOrderSummaryPlanCount(long summaryId)
    {
        _WmsOutOrderSummary.UpdateOutOrderSumaryRealNum(summaryId);
    }

    public int ExecuteTask(int taskNo, long locId)
    {
        var task = _Task.GetExecutableTaskByTaskNo(taskNo);
        if (task?.Id is not long taskId)
        {
            return 0;
        }
        var num = _Task.UpdateTaskAndCmdStatus(locId, taskId, (int)EnumTaskStatus.Executed);

        // 删除绑定
        var skuId = task.SkuId.GetValueOrDefault();
        _WcsLocSku.DeleteWcsLocSkuBySkuLoc(locId, skuId);

        //异常任务直接删除备份任务和指令
        //此处先不删除 等到了下传口再删除
        if (task.TaskType == (int)EnumTaskType.Abnormal)
        {
            //_Task.BakAndDeleteTaskAndCmd(task.Id.GetValueOrDefault());
        }
        return num;
    }

    public int FinishTask(int taskNo, long locId)
    {
        var taskCmd = _TaskCmd.GetExecutedTaskCmdByTaskNo(taskNo);
        if (taskCmd?.TaskId is not long taskId)
        {
            return 0;
        }
        var targetLoc = taskCmd.TargetLoc.GetValueOrDefault();

        // 获取 skuID
        var task = _Task.GetTaskByTaskNo(taskNo);
        if (task?.SkuId is not long skuId)
        {
            return -1;
        }

        // 修改状态
        _TaskCmd.UpdateTaskCmdStatus(locId, taskId, (int)EnumTaskCmdStatus.Finish);

        // 备份删除
        _TaskCmd.BakAndDeleteCmd(taskId);

        // 重置货位定位
        _WcsLocSku.SetWcsLocSku(targetLoc, skuId);

        return 1;
    }
}